data Fracao = Fracao { dividendo :: Integer
                                 , divisor :: Integer
                                 } deriving (Show)
                     
inverterFracao :: Fracao -> Fracao
inverterFracao a = Fracao (divisor a) (dividendo a)   

simplificarFracao :: Fracao -> Fracao
simplificarFracao a = Fracao ((dividendo a)  `div` mdc)  ((divisor a)  `div` mdc)
    where mdc = gcd (dividendo a) (divisor a)
                    
quoeficienteMMC :: Integer -> Integer -> Integer -> Integer
quoeficienteMMC a b c = a `div` b * c
                     
somarFracoes :: Fracao -> Fracao -> Fracao
somarFracoes a b = simplificarFracao $ Fracao ((quoeficienteMMC mmc (divisor a) (dividendo a)) + (quoeficienteMMC mmc (divisor b) (dividendo b))) mmc
    where mmc = lcm (divisor a) (divisor b)
    
subtrairFracoes :: Fracao -> Fracao -> Fracao 
subtrairFracoes a b = simplificarFracao $ Fracao ((quoeficienteMMC mmc (divisor a) (dividendo a)) - (quoeficienteMMC mmc (divisor b) (dividendo b))) mmc
    where mmc = lcm (divisor a) (divisor b)
 
multiplicarFracoes :: Fracao -> Fracao -> Fracao
multiplicarFracoes a b = simplificarFracao $ Fracao ((dividendo a) * (dividendo b)) ((divisor a) * (divisor b))

dividirFracoes :: Fracao -> Fracao -> Fracao
dividirFracoes a b = multiplicarFracoes a $ inverterFracao b